#ifndef __DEFINICIONES_HS_CAR_H
#define __DEFINICIONES_HS_CAR_H

#define DEBUG_CLOCK 0

// Opciones de comunicacion serie
#define USART1_RX_TIMEOUT_MS					3
#define USART1_TIMEOUT_ACK						10

// Estados de la maquina de comunicaciones general de USART1 (comunicacion con el PC)
#define USART1_PASIVO 								1
#define USART1_ENVIANDO_ACK						2
#define USART1_ESPERA_ACK		  				3
#define USART1_ENVIANDO_RESPUESTA			4

// Estados de las rutinas de recepcion de USART1 (comunicacion con el PC)
#define USART1_TX_ESTADO_CABECERA 		1
#define USART1_TX_ESTADO_COMANDO  		2
#define USART1_TX_ESTADO_CRC      		3
#define USART1_TX_ESTADO_NBYTES    		4
#define USART1_TX_ESTADO_NOT_NBYTES 	5
#define USART1_TX_ESTADO_BUCLE 				6

// Estados de las rutinas de transmision de USART1 (comunicacion con el PC)
#define USART1_RX_ESTADO_CABECERA 		1
#define USART1_RX_ESTADO_COMANDO  		2
#define USART1_RX_ESTADO_CRC      		3
#define USART1_RX_ESTADO_NBYTES    		4
#define USART1_RX_ESTADO_NOT_NBYTES 	5
#define USART1_RX_ESTADO_BUCLE 				6

//Cabecera protocolo
#define USART1_CABECERA 0xAA

// Comandos del protocolo
#define USART1_COMANDO_ACK 							0xF5
#define USART1_COMANDO_NACK 						0xFA

// Comandos de control cortos
#define USART1_COMANDO_STOP							0x5A
#define USART1_COMANDO_CONTROL_MANUAL 	0x02

// Comandos de control largos
#define USART1_COMANDO_MAPEO_DIRECC		0x03
#define USART1_COMANDO_MAPEO_ACELER		0x04
#define USART1_COMANDO_LOOPBACK				0x05
#define USART1_COMANDO_LEE_BARRAS     0x06
#define USART1_RESPUESTA_TELEMETRIA     0x07
#define USART1_COMANDO_LEE_ENCODER		0x08
#define USART1_COMANDO_ENVIA_VAR 0x09
#define USART1_COMANDO_SOLICITA_VAR 0x0A
#define USART1_BAUDIOS 19200


#define USART1_ES_COMANDO_CORTO(COMANDO)   (((COMANDO) == USART1_COMANDO_ACK) || \
											((COMANDO) == USART1_COMANDO_NACK) || \
											((COMANDO) == USART1_COMANDO_STOP) || \
											((COMANDO) == USART1_COMANDO_CONTROL_MANUAL) || \
											((COMANDO) == USART1_COMANDO_LEE_BARRAS) || \
											((COMANDO) == USART1_COMANDO_LEE_ENCODER) \
											)
											
#define USART1_ES_COMANDO_LARGO(COMANDO)   (((COMANDO) == USART1_COMANDO_MAPEO_DIRECC)	|| \
											((COMANDO) == USART1_COMANDO_MAPEO_ACELER) || \
											((COMANDO) == USART1_COMANDO_LOOPBACK) || \
											((COMANDO) == USART1_RESPUESTA_TELEMETRIA) ||\
											((COMANDO) == USART1_COMANDO_SOLICITA_VAR) ||\
                                            ((COMANDO) == USART1_COMANDO_ENVIA_VAR) \
											)

#define varid_Kp_gas 0
#define varid_Ki_gas 1
#define varid_Kd_gas 2

#define PWM_IN_ESPERA_SUBIDA 0
#define PWM_IN_ESPERA_BAJADA 1

#define PWM_IN_Leer_Switch 0
#define PWM_IN_Leer_Aceleracion 1
#define PWM_IN_Leer_Direccion 2
#define PWM_IN_Leer_Aux 4

#define PWM_IN_TIEMPO_CICLO 23 //Tiempo durante el cual se lee una entrada PWM antes de cambiar a otra.

#define CENTRO_ACC 5240
#define MAXIMO_ACC 6666
#define CENTRO_DIR 4905
#define MAXIMO_DIR 6034
#define CENTRO_AUX 5150
#define MAXIMO_AUX 6495

#define MAX_GIRO_TRASERO_PWM 1850
#define MAX_GIRO_DELANTERO_PWM 1600
#define MAX_ACC_PWM 1000

#define PINES_BARRAS_PORTB GPIO_Pin_13 | GPIO_Pin_9 | GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_8
#define PINES_BARRAS_PORTC	GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5
#define PINES_BARRAS_PORTD GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15
#define PINES_BARRAS_PORTE	GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7  | GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14 | GPIO_Pin_15

#define CONTROL_AUTOMATICO 1
#define CONTROL_MANUAL 0
#define PARADA_EMERGENCIA 3

#define TIMEOUT_SENAL 10

#define IR_INACTIVO 0
#define IR_LEYENDO_BARRAS 1
#define IR_CARGANDO_BARRAS 2

#define Pin_LED GPIO_Pin_5
#define Puerto_LED GPIOB

#define Pin_Boton GPIO_Pin_15
#define Puerto_Boton GPIOB

#define Pin_FC_Colision GPIO_Pin_6
#define Puerto_FC_Colision GPIOD

#define Pin_FC_Puertas GPIO_Pin_8
#define Puerto_FC_Puertas GPIOA

#define Pin_Altavoz GPIO_Pin_3
#define Puerto_Altavoz GPIOA

#define IR_TIMEOUT 5 //Milisegundos, periodo con el cual se muestrean las barras de sensores IR.
#define IR_MAX IR_TIMEOUT*1000
#define IR_TIEMPO_CARGA 20 //Microsegundos, tiempo para cargar las barras.
#define IR_NUM_CALIBRACION 500 //Numero de medidas que se toman para calibrar las barras
#define HAYLINEA_THRES	0.33
#define HAYLINEA_NUM 		2

#define ESPERA_INICIAL_MS 1000

#define PERIODO_MEDIDA_VELOCIDAD_MS 125
#define NUM_MEDIDAS_FILTRO_PB_VELOCIDAD 5
#define PULSOS_PULGADA 9
#define METROS_PULGADA 0.0254
#define METROS_POR_PULSO METROS_PULGADA/PULSOS_PULGADA
#define MILISEGUNDOS_POR_SEGUNDO 1000
#define FACTOR_CONVERSION_ENCODER METROS_POR_PULSO * MILISEGUNDOS_POR_SEGUNDO / PERIODO_MEDIDA_VELOCIDAD_MS

#define CONSIGNA_DIRECCION_CENTRO 11.5
#define MULTIPLICADOR_BIAS 20

#define CONSIGNA_VELOCIDAD_ZONA_DECISIONES 1
#define CONSIGNA_VELOCIDAD_ZONA_INICIAL 1
#define CONSIGNA_VELOCIDAD_RAMPAS 0.5

#define LONGITUD_COCHE 0.545
#define MARGEN_GUARDA_PUERTAS 0
#define MARGEN_BIFURCA 3 * LONGITUD_COCHE
#define DIST_8_A	6.541
#define DIST_8_B	3.497
#define DIST_9_A	3.336/2
#define DIST_9_B	3.336/2
#define DIST_10_A	2.896/2
#define DIST_10_B	2.896/2
#define DIST_11_A	2.867/2
#define DIST_11_B	2.867/2
#define DIST_12_A	1.772/2
#define DIST_12_B	1.772/2
#define DIST_13_A	3.166/2
#define DIST_13_B	3.166/2

#define MS_IGNORA_PUERTAS 1000
#define MS_BEEP_PUERTAS 500

#define ESPERA_INICIAL 0
#define CALIBRANDO_CLARO 1
#define ESPERA_SUELTA_BOTON 2
#define CALIBRANDO_OSCURO 3




#endif //__DEFINICIONES_HS-CAR_H
